-
Notifications
You must be signed in to change notification settings - Fork 309
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[톰캣 구현하기 - 3, 4단계] 히이로(문제웅) 미션 제출합니다. #455
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요 히이로! 3, 4단계 쉽지 않았을텐데 정말 고생 많으셨습니다.
이번 리뷰에는 코드 스타일, 변수명 등 코드 품질보다는 각 객체의 역할, 의존성, 구조 등을 중점적으로 봤어요.
주로 히이로의 의견이 궁금한 부분들을 리뷰로 남겨두었습니다.
감사합니다 :)
ps. 아 참 소나클라우드에서 제안하는 내용들 모두 꽤 괜찮더라구요? 리뷰 반영하시면서 소나 클라우드도 한번 참고하는걸 추천드립니다 ㅎㅎ
tomcat/src/main/java/nextstep/org/apache/catalina/connector/Connector.java
Outdated
Show resolved
Hide resolved
tomcat/src/main/java/nextstep/org/apache/catalina/connector/Connector.java
Outdated
Show resolved
Hide resolved
tomcat/src/main/java/nextstep/org/apache/coyote/http11/request/Http11Request.java
Show resolved
Hide resolved
tomcat/src/main/java/nextstep/org/apache/coyote/http11/request/Http11Request.java
Show resolved
Hide resolved
@@ -14,14 +14,14 @@ public class StartLine { | |||
|
|||
private String httpMethod; | |||
private String path; | |||
private String httpVersion; | |||
private String queryString = null; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
queryString을 따로 필드로 빼기보다는, path에 쿼리스트링도 포함하여 가지고 있다가, 필요로 할 때 따로 추출해서 반환하는 메서드가 하나 있으면 좋을 것 같아요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저는 개인적으로 생각해봤을 때 path라는 변수에 쿼리스트링이 포함된 값이 저장되는게 어색하더라구요~ 혹시 Http정의에서 path는 queryString을 포함하는 개념일까요? 그런 부분이 있다면 다시 알려주시면 감사하겠습니당 🙇
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mdn 문서에서는 path 변수와 함께 설명하기도 하고, 이 글이나, 저 글에서도 모두 "url 뒤에 붙는 문자열이다" 정도로만 설명하고, 따로 분리해서 생각하진 않네요.
이렇게 봐서는 path에 queryString을 포함하는 개념으로 보이긴 하네요.
사실 coyote/Request
객체에서도 MessageBytes queryMB = MessageBytes.newInstance();
이라는 필드가 있고 이게 쿼리 파라미터를 가지는 필드같은데요. 오늘 강의 시간에 구구께서 객체지향 생활체조도 지키며 미션 진행하라는 말씀을 빌려서라도 함께 저장하는건 어떤가 다시 여쭤보고 싶습니다!
tomcat/src/main/java/nextstep/org/apache/catalina/servlet/LoginServlet.java
Show resolved
Hide resolved
tomcat/src/main/java/nextstep/org/apache/catalina/servlet/LoginServlet.java
Outdated
Show resolved
Hide resolved
import java.util.Map; | ||
import java.util.Objects; | ||
import java.util.Optional; | ||
|
||
public class HttpUtil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기에 있는 메서드들, 모두 Http11Request 내부로 이동해도 좋을 것 같아요.
오히려, Http11Request가 이런 역할을 하는 것이 좀 더 적절하다고도 생각이 드네요 🧐
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
음 Http11Request 뿐만 아니라 Http11Processor를 비롯해 다른 서블릿에서도 사용될 수 있는 로직들이라 util로 분리해냈는데요, 어떤 부분에서 도기가 그렇게 생각하셨는지 좀 더 말씀해주셔도 좋을 것 같습니다 :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이번 리뷰에서는 각 객체들의 역할을 중점적으로 보았는데요.
현재 Http11Processor
는 createResponseBody
, selectFirstContentTypeOrDefault
를 사용하고 있네요.
그런데 이 두 메서드는 HttpResponse에서도 수행할 수 있다고 생각합니다.
preprocessRequestPath
이 메서드는, StartLine
을 의존하는 Http11Request
가 수행해도 충분하다고 생각돼요.
위 같은 이유로 말씀 드렸습니다.
그리고 사실, preprocessRequestPath
의 로직이 AbstractServlet
의 createResponseBody
의 로직이 일부와 중복이에요 !!
tomcat/src/main/java/nextstep/org/apache/coyote/http11/request/Http11Request.java
Outdated
Show resolved
Hide resolved
private StartLine startLine; | ||
private Map<String, String> queryParams = new HashMap<>(); | ||
private Map<HttpHeader, String> headers = new HashMap<>(); | ||
private final Cookies cookies = new Cookies(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
사실 쿠키도 헤더의 일종이니까 얘도 Header 내에서 처리할 수 있을 것 같아요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분은 set-cookie가 여러개가 한번에 반환될 수 있는 경우를 고려해서 구현한 부분이었습니다. 현재 headers는 key 값을 중복으로 가질 수 없기 때문에 여기에 "Set-Cookie" 헤더를 담는 경우 한 응답 내에 여러 "Set-Cookie" 헤더를 담을 수 없어서 이런 방식으로 구현했습니다 ㅎㅎ...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
set-cookie가 한 번에 여러 개 반환되는 경우도 고려하셨군요! 엄청 꼼꼼하시네요 👍
그런데, Set-Cookie
가 이미 Map에 있다면, Value를 이어 붙이는 방식으로 추가해나가도 될 것 같아요 👀
만약 스프링이었다면 MultiValueMap을 썼겠죠? 😅
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요 도기! 히이로입니다.
리뷰해주신 부분들 수정 반영하고 리뷰 재요청드립니다.
리뷰해주신 내용들에 대한 제 생각들을 정리한 부분들이 몇 군데 있는데 이 부분 얘기 나눠보시면서 미션 마무리 해도 좋을 것 같습니다 ㅎㅎ 조금 시간에 쫓겨 리팩토링 한 부분도 없지 않아 있어서 석연찮은 부분이 있으면 말씀해주시면 좋겠습니다.
바쁜 와중에도 정성 넘치는 리뷰 해주셔서 많이 배웠습니다. 감사합니다!! 🙇
tomcat/src/main/java/nextstep/org/apache/coyote/http11/Http11Processor.java
Outdated
Show resolved
Hide resolved
tomcat/src/main/java/nextstep/org/apache/catalina/connector/Connector.java
Outdated
Show resolved
Hide resolved
import nextstep.org.apache.catalina.servlet.RegisterServlet; | ||
import nextstep.org.apache.catalina.servlet.Servlet; | ||
|
||
public class Context { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
catalina 패키지 내에서 servlet context 역할을 수행하는 객체 클래스 네이밍을 context라고 사용하더라구요! 그래서 해당 부분을 반영해서 작성해본 네이밍이었습니다 ㅎㅎ...
tomcat/src/main/java/nextstep/org/apache/catalina/servlet/AbstractServlet.java
Outdated
Show resolved
Hide resolved
tomcat/src/main/java/nextstep/org/apache/catalina/servlet/AbstractServlet.java
Outdated
Show resolved
Hide resolved
@@ -14,14 +14,14 @@ public class StartLine { | |||
|
|||
private String httpMethod; | |||
private String path; | |||
private String httpVersion; | |||
private String queryString = null; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저는 개인적으로 생각해봤을 때 path라는 변수에 쿼리스트링이 포함된 값이 저장되는게 어색하더라구요~ 혹시 Http정의에서 path는 queryString을 포함하는 개념일까요? 그런 부분이 있다면 다시 알려주시면 감사하겠습니당 🙇
import java.util.Map; | ||
import java.util.Objects; | ||
import java.util.Optional; | ||
|
||
public class HttpUtil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
음 Http11Request 뿐만 아니라 Http11Processor를 비롯해 다른 서블릿에서도 사용될 수 있는 로직들이라 util로 분리해냈는데요, 어떤 부분에서 도기가 그렇게 생각하셨는지 좀 더 말씀해주셔도 좋을 것 같습니다 :)
tomcat/src/main/java/nextstep/org/apache/coyote/http11/request/Http11Request.java
Outdated
Show resolved
Hide resolved
private StartLine startLine; | ||
private Map<String, String> queryParams = new HashMap<>(); | ||
private Map<HttpHeader, String> headers = new HashMap<>(); | ||
private final Cookies cookies = new Cookies(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분은 set-cookie가 여러개가 한번에 반환될 수 있는 경우를 고려해서 구현한 부분이었습니다. 현재 headers는 key 값을 중복으로 가질 수 없기 때문에 여기에 "Set-Cookie" 헤더를 담는 경우 한 응답 내에 여러 "Set-Cookie" 헤더를 담을 수 없어서 이런 방식으로 구현했습니다 ㅎㅎ...
tomcat/src/main/java/nextstep/org/apache/coyote/http11/request/Http11Request.java
Show resolved
Hide resolved
Kudos, SonarCloud Quality Gate passed! 0 Bugs 0.0% Coverage The version of Java (11.0.20.1) you have used to run this analysis is deprecated and we will stop accepting it soon. Please update to at least Java 17. |
안녕하세요 히이로 !! 시간 괜찮으실 때 편하게 남겨주세요. 아님 직접 만나서 이야기 나눠도 좋을 것 같아요. |
안녕하세요 도기, 히이로입니다!
원래는 토요일까지는 PR을 날려서 주말에 여유로우실 때 리뷰를 요청하고 싶었으나... 개인적인 일정들이 갑자기 많이 생겨서 주말이 다 지나서야 요청드리네요 😭
지난 번에 말씀해주신대로 전체적인 코드 구조를 개선하는데 집중했는데 도기가 보셨을 때 적절한 책임분리가 잘 되었다고 생각하시는지 궁금합니다. 이에 대해 의견 나눠보면 좋을 것 같아요!
항상 꼼꼼한 리뷰 감사드립니다. 이번에도 잘 부탁드려요! 🙇